﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Interface.DAL
{
    /// <summary>
    /// 文章表操作类接口
    /// </summary>
    public interface IPost
    {
        #region 增加记录
        /// <summary>
        /// 向文章表中插入一行数据, 返回当前插入数据的主键ID
        /// </summary>
        /// <param name="post">要插入的文章对象</param>
        /// <returns>返回当前插入数据的主键ID</returns>
        int Insert(Post post);
        #endregion

        #region 删除记录

        #region 删除一条记录
        /// <summary>
        /// 根据文章ID删除对应文章表中的文章记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除的文章ID</param>
        /// <param name="deleteComment">是否删除该文章对应所有评论</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int id, bool deleteComment);
        #endregion

        #region 删除多条记录
        /// <summary>
        /// 根据文章ID数组删除对应文章表中的文章记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除的文章ID数组</param>
        /// <param name="deleteComment">是否删除该文章对应所有评论</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int[] ids, bool deleteComment);
        #endregion

        #endregion

        #region 更新记录

        #region 更新一个完整文章对象
        /// <summary>
        /// 更新一个完整文章对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="post">更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdatePost(Post post);
        #endregion

        #region 单个字段更新

        #region 根据文章ID数组批量更新文章状态
        /// <summary>
        /// 根据文章ID数组批量更新文章状态, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要更新的文章ID数组</param>
        /// <param name="status">更新的状态(0:公开, 1:加密, 2:私密, 3:继承, 4:草稿, 5:自动草稿, 6:回收站...)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateStatus(int[] ids, int status);
        #endregion

        #region 根据文章ID更新文章标题,副标题,别名,内容
        /// <summary>
        /// 根据文章ID更新文章标题,副标题,别名,内容, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="title">更新的标题(不更新则传入null)</param>
        /// <param name="subTitle">更新的副标题(不更新则传入null)</param>
        /// <param name="slug">更新的别名(不更新则传入null)</param>
        /// <param name="content">更新的内容(不更新则传入null)</param>
        /// <param name="excerpt">更新的摘要(不更新则传入null)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateInfo(int id, string title, string subTitle, string slug, string content, string excerpt);
        #endregion

        #region 根据文章ID更新文章浏览次数
        /// <summary>
        /// 根据文章ID更新文章浏览次数, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="addCount">增加的数量(一般为1)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateViewCount(int id, int addCount);
        #endregion

        #region 根据文章ID更新文章评论次数
        /// <summary>
        /// 根据文章ID更新文章浏览次数, 返回执行结果受影响行数
        /// 可以使用触发器实现, 此处未实现, 待续..
        /// </summary>
        /// <param name="id">要更新的文章ID</param>
        /// <param name="addCount">增加的数量(一般为1)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateCommentCount(int id, int addCount);
        #endregion

        #endregion

        #endregion

        #region 选取记录

        #region 常用方法

        #region 选取表中主键最大值
        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        int SelectMaxId();
        #endregion

        #region 是否存在别名
        /// <summary>
        /// 检查表中是否已经存在该别名, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="slug">要确定的别名</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        bool ExistsSlug(string slug);
        #endregion

        #region 选取文章信息表中文章总数
        /// <summary>
        /// 选取文章信息表中文章总数
        /// </summary>
        /// <param name="where">选择条件(忽略则传入null或空值)(不能使用参数, 要使用参数化写重载)</param>
        /// <returns>总数</returns>
        int SelectPostsCount(string where);
        #endregion

        #endregion

        #region 选取文章集合

        #region 选取所有文章信息集合
        /// <summary>
        /// 选取文章信息表中所有文章信息, 返回文章信息对象集合, 如果不存在则返回null
        /// </summary>
        /// <returns>所有文章信息集合</returns>
        List<Post> SelectPostList();
        #endregion

        #region 根据指定状态, 指定浏览等级, 指定页码, 和页面大小.. 按照指定字段和排序规则排列(简化版)
        /// <summary>
        /// 根据指定状态, 指定浏览等级, 指定页码, 和页面大小 按照指定字段和排序规则排列
        /// 从文章信息表中选取指定条数文章信息
        /// 如果指定int类型参数传入-1, string传入null, 则表示忽略该检索条件
        /// 将默认按照更新时间降序排序, 返回文章信息对象集合, 不存在则返回NULL(简化版)
        /// </summary>
        /// <param name="status">文章当前状态(0:公开, 1:加密, 2:私密, 3:继承, 4:草稿, 5:自动草稿, 6:回收站...)(忽略该条件则传入-1)</param>
        /// <param name="type">文章类型(0:Post, 1:Page, 2:Media...)(忽略该条件则传入-1)</param>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码(取全部则传入-1)</param>
        /// <param name="orderField">排序字段(忽略该条件则传入null)</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))(取全部则传入-1)</param>
        /// <returns>符合条件文章信息对象集合, 如果不存在则返回null</returns>
        List<Post> SelectPostList(int status, int type, int pageSize, int pageIndex, string orderField, int order);
        #endregion

        #region 根据指定状态, 指定浏览等级, 指定页码, 和页面大小.. 按照指定字段和排序规则排列
        /// <summary>
        /// 根据指定关键词, 状态, 浏览等级, 类别ID, 用户ID, 开始时间, 结束时间, 指定页码, 和页面大小 按照指定字段和排序规则排列
        /// 从文章信息表中选取指定条数文章信息
        /// 如果指定int类型参数传入-1, string传入null, 则表示忽略该检索条件
        /// 将默认按照更新时间降序排序, 返回文章信息对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="keyword">关键词(忽略该条件则传入null)</param>
        /// <param name="status">文章当前状态(0:公开, 1:加密, 2:私密, 3:继承, 4:草稿, 5:自动草稿, 6:回收站...)(忽略该条件则传入-1)</param>
        /// <param name="type">文章类型(0:Post, 1:Page, 2:Media...)(忽略该条件则传入-1)</param>
        /// <param name="categoryId">类别ID(忽略该条件则传入-1)</param>
        /// <param name="userId">用户ID(忽略该条件则传入-1)</param>
        /// <param name="beginDate">起始日期(忽略该条件则传入null)</param>
        /// <param name="endDate">截至日期(忽略该条件则传入null)</param>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码(取全部则传入-1)</param>
        /// <param name="orderField">排序字段(忽略该条件则传入null)</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))(取全部则传入-1)</param>
        /// <param name="recordCount">返回查询到的记录数</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        List<Post> SelectPostList(string keyword, int status, int type, int categoryId, int userId, string beginDate, string endDate, int pageSize, int pageIndex, string orderField, int order, out int recordCount);
        #endregion

        #region 根据文章归档年月选取文章信息集合
        /// <summary>
        /// 根据文章归档年月选取文章信息集合默认按照更新时间降序排序, 返回对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="beginDate">开始时间</param>
        /// <param name="endDate">结束时间</param>
        /// <param name="status">文章当前状态(0:公开, 1:加密, 2:私密, 3:继承, 4:草稿, 5:自动草稿, 6:回收站...)(忽略该条件则传入-1)</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        List<Post> SelectPostList(string beginDate, string endDate, int status);
        #endregion

        #region 根据用户ID选取文章信息集合
        /// <summary>
        /// 根据用户ID选取文章信息集合默认按照更新时间降序排序, 返回对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="userid">用户ID</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        List<Post> SelectPostList(int userid);
        #endregion

        #region 根据ID数组批量获取文章信息集合
        /// <summary>
        /// 根据ID数组批量获取文章信息集合, 返回对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="ids">文章ID数组</param>
        /// <param name="status">文章当前状态(0:公开, 1:加密, 2:私密, 3:继承, 4:草稿, 5:自动草稿, 6:回收站...)(忽略该条件则传入-1)</param>
        /// <returns>多条文章信息集合, 不存在则返回NULL</returns>
        List<Post> SelectPostList(int[] ids, int status);
        #endregion

        #region 选取上一篇和下一篇
        /// <summary>
        /// 选取文章上一篇和下一篇文章对象, 返回对象集合, 如果不存在则返回null
        /// </summary>
        /// <returns>长度为2的文章对象集合,0为上一篇, 1为下一篇 不存在则返回NULL</returns>
        //Post[] SelectPreviousAndNext(Post current);
        #endregion

        #region 选取文章归档信息集合
        /// <summary>
        /// 选取文章归档信息集合, 返回对象集合, 如果不存在则返回null
        /// </summary>
        /// <returns>文章归档信息集合, 不存在则返回NULL</returns>
        List<Archive> SelectArchiveList();
        #endregion

        #endregion

        #region 选取文章对象

        #region 根据文章ID选取文章信息对象
        /// <summary>
        /// 根据文章ID选取文章信息对象, 返回文章信息对象, 如果不存在则返回null
        /// </summary>
        /// <param name="id">文章ID</param>
        /// <returns>文章对象, 不存在则返回NULL</returns>
        Post SelectPost(int id);
        #endregion

        #region 根据文章Slug选取文章信息对象
        /// <summary>
        /// 根据文章Slug选取文章信息对象, 返回文章信息对象, 不存在则返回NULL
        /// </summary>
        /// <param name="slug">文章Sulg</param>
        /// <returns>文章对象, 不存在则返回NULL</returns>
        Post SelectPost(string slug);
        #endregion

        #endregion

        #endregion
    }
}
